<?php
/**
 * @param $filename
 * @param $head
 * @param $dataArray
 */
function exportCsv($filename, $head, $dataArray)
{
    // 输出Excel文件头，可把user.csv换成你要的文件名
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="' . $filename . '.csv"');
    header('Cache-Control: max-age=0');

    // 从数据库中获取数据，为了节省内存，不要把数据一次性读到内存，从句柄中一行一行读即可
    // 打开PHP文件句柄，php://output 表示直接输出到浏览器
    $fp = fopen('php://output', 'a');
    // 输出Excel列名信息
    foreach ($head as $i => $v) {
    // CSV用Excel打开时，不支持UTF-8编码，而支持GBK编码，一定要转换，否则乱码
        $head[$i] = iconv('utf-8', 'gbk', $v);
    }
    // 将数据通过fputcsv写到文件句柄
    fputcsv($fp, $head);
    // 计数器
    $cnt = 0;
    // 每隔$limit行，刷新一下输出buffer，不要太大，也不要太小
    $limit = 100000;

    // 逐行取出数据，不浪费内存
    foreach ($dataArray as $item) {
        $cnt++;
        if ($limit == $cnt) {
        //刷新一下输出buffer，防止由于数据过多造成问题
            ob_flush();
            flush();
            $cnt = 0;
        }
        foreach ($item as $i => $v) {
            $item[$i] = iconv('utf-8', 'gbk', $v);
        }
        fputcsv($fp, $item);
    }
}
/*一次查出所有数据再导出*/
$head = array('id', 'name');
$dataArray = array(
    ['id' => '1', 'name' => 'name1'],
    ['id' => '2', 'name' => 'name2'],
    ['id' => '3', 'name' => 'name3']
);
exportCsv('filename',$head,$dataArray);